// 1. 导入axios
import axios from 'axios'
import { Toast } from 'vant'
import store from '@/store/'
import router from '@/router'

// 2. 调用axos.create得到axios的实例对象
const request = axios.create({
  baseURL: process.env.VUE_APP_BASE_URL
})
// 添加请求拦截器
request.interceptors.request.use(function (config) {
  // 先判断是否有user这个对象
  const user = store.state.user
  if (user && user.token && !config.headers.Authorization) {
    // 如果能满足这两个条件，则给请求头添加Authorization属性
    config.headers.Authorization = `Bearer ${store.state.user.token}`
  }
  // console.log(config);
  // 在发送请求之前做些什么
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
request.interceptors.response.use(function (response) {
  // 2xx 范围内的状态码都会触发该函数。
  // 对响应数据做点什么
  return response.data || response
}, async function (error) {
  const user = store.state.user
  if (error.response) {
    if (error.response.status === 401) {
      if (user && user.refresh_token) {
        // console.log(user.refresh_token);
        try {
          const res = await request({
            method: 'PUT',
            url: '/v1_0/authorizations',
            headers: {
              Authorization: `Bearer ${user.refresh_token}`
            }
          })
          store.commit('setUser', {
            token: res.data.token,
            refresh_token: user.refresh_token
          })
          error.config.headers.Authorization = ''
          return request(error.config)
        } catch (error) {
          // 清空token
          store.commit('setUser', null)
          console.log(error.response.status)
          // 跳转到登录页面
          router.push('/login')
        }
      } else {
        // 清空token
        store.commit('setUser', null)
        console.log(error.response.status)
        // 跳转到登录页面
        router.push('/login')
      }
      // // 清空token
      // store.commit('setUser', null)
      // console.log(error.response.status)
      // // 跳转到登录页面
      // router.push('/login')
    }
    Toast.fail(error.response.data.message)
  } else {
    Toast.fail('信息错误')
  }
  // 超出 2xx 范围的状态码都会触发该函数。
  // 对响应错误做点什么
  return Promise.reject(error)
})
// 3. 导入创建好的axios实例对象，供其他模块使用发送网络请求
export default request
